home *** CD-ROM | disk | FTP | other *** search
- int
- do_caller(arg,maxarg,gimme,arglast)
- ARG *arg;
- int maxarg;
- int gimme;
- int *arglast;
- {
- STR **st = stack->ary_array;
- register int sp = arglast[0];
- register CSV *csv = curcsv;
- STR *TARG;
- int count = 0;
-
- if (!csv)
- fatal("There is no caller");
- if (maxarg)
- count = (int) str_gnum(st[sp+1]);
- for (;;) {
- if (!csv)
- return sp;
- if (DBsub && csv->oldcsv && csv->oldcsv->sub == stab_sub(DBsub))
- count++;
- if (!count--)
- break;
- csv = csv->oldcsv;
- }
- if (gimme != G_ARRAY) {
- STR *TARG = ARGTARG;
- str_set(TARG,csv->oldcmd->c_stash->tbl_name);
- STABSET(TARG);
- st[++sp] = TARG;
- return sp;
- }
-
- #ifndef lint
- (void)astore(stack,++sp,
- str_2mortal(str_make(csv->oldcmd->c_stash->tbl_name,0)) );
- (void)astore(stack,++sp,
- str_2mortal(str_make(stab_val(csv->oldcmd->c_filestab)->str_ptr,0)) );
- (void)astore(stack,++sp,
- str_2mortal(str_nmake((double)csv->oldcmd->c_line)) );
- if (!maxarg)
- return sp;
- TARG = Str_new(49,0);
- stab_efullname(TARG, csv->stab);
- (void)astore(stack,++sp, str_2mortal(TARG));
- (void)astore(stack,++sp,
- str_2mortal(str_nmake((double)csv->hasargs)) );
- (void)astore(stack,++sp,
- str_2mortal(str_nmake((double)csv->wantarray)) );
- if (csv->hasargs) {
- ARRAY *ary = csv->argarray;
-
- if (!dbargs)
- dbargs = stab_xarray(aadd(stabent("DB'args", TRUE)));
- if (dbargs->ary_max < ary->ary_fill)
- astore(dbargs,ary->ary_fill,Nullstr);
- Copy(ary->ary_array, dbargs->ary_array, ary->ary_fill+1, STR*);
- dbargs->ary_fill = ary->ary_fill;
- }
- #else
- (void)astore(stack,++sp,
- str_2mortal(str_make("",0)));
- #endif
- return sp;
- }
-
-